 1.Apache Kylin 实战之实时OLAP
   
   Kylin V3.0.0 发布了全新的实时OLAP功能，借助新添加的流接收器群集的功能，
Kylin可以以亚秒级的延迟查询流数据。如果希望以微批量方式（大约10分钟的延
迟）接收kafka事件，则可以考虑使用流式构建。这两个功能全部用于 Kafka 数据
源，勿混合使用。
   1).基本概念
   Kafka Cluster [data source]
   Kylin Process [job server/query server/coordinator]
   Kylin streaming receiver Cluster [real-time part computation and storage]
   HBase Cluster [historical part storage]
   Zookeeper Cluster [receiver metadata storage]
   MapReduce [distributed computation]
   HDFS [distributed storage]
   (1).Streaming Coordinator
   Streaming coordinator充当streaming receiver cluster的master node。其主要职
责包括：分配/取消分配特定的topic partition给特定的副本集，暂停或继续使用，收
集消费速率（每秒消息）等详细信息。
   (2).Coordinator Cluster
   为了消除单点故障，我们可以启动多个coordinator程序。当集群具有多个coordinator
程序时，zookeeper将选择一个leader。只有leader将回答coordinator客户端的请求,
其他进程将成为备用/候选者，因此将消除单点故障。
   (3).Streaming Receiver
   Streaming Receiver是工作节点。它由Streaming Coordinator管理，其职责如下：
       摄取（ingest）实时事件
	   在本地构建基本cuboid（如果配置正确，则可以构建更多cuboid）
	   回答查询请求以获取分配给自身的部分数据
	   将本地segment缓存上传到HDFS或在segment状态更改为不可变时将其删除
   (4).Receiver Cluster
   所有streaming receiver的集合称为receiver cluster。
   (5).Replica Set
   Replica Set是一组streaming receivers。Replica Set是任务分配的最小单位，这意
味着一个Replica Set中的所有receivers都将执行相同的任务（包含相同的主题分区)。
当某些receiver意外关闭但所有replica set都具有至少一个可访问的receiver时,
receiver cluster仍可查询，并且数据不会丢失。
   2).准备环境
   cd /opt/lagou/servers
   # coordinator
   cp -r kylin-3.1.1/ kylin-3.1.1-master/
   # receiver
   cp -r kylin-3.1.1/ kylin-3.1.1-receiver/
   (1).开启Kylin进程
   kylin进程将充当receiver cluster的coordinator。7070是coordinator的默认端口。
   cd /opt/lagou/servers/kylin-3.1.1-master/bin
   ./kylin.sh start
   (2).开启Receiver Process
   receiver process将作为receiver cluster的工作方。9090是receiver的默认端口。
   cd /opt/lagou/servers/kylin-3.1.1-receiver/bin
   ./kylin.sh streaming start
   (3).模拟流数据
   # 使用工具，每秒会向以上topic每秒发送100条记录
kylin.sh org.apache.kylin.source.kafka.util.KafkaSampleProducer
--topic kylin_streaming_topic1 --broker linux121:9092,linux122:9092
   3).创建cube
   步骤：定义数据源 => 定义Model => 定义Cube => Enable Cube => Kafka发送消息
   Model、Cube与前面介绍的方式类似。
   (1).创建数据源
   (2).设计Model
   当前，流cube不支持与lookup tables连接，定义数据模型时，仅选择fact table,
不提供lookup table
   流cube必须分区，选择timestamp列作为分区列
   (3).设计Cube
   流Cube与普通cube几乎相同。需要注意以下几点：
       选择“ MapReduce”作为构建引擎，现在不支持Spark
	   kylin.stream.cube.window 将决定如何将事件event划分到不同的segment,
它是每个segment的持续时间，以秒为单位的值，默认值为3600
       kylin.stream.cube.duration 确定segment等待迟到事件event的时间
	   kylin.stream.segment.retention.policy 当Segment状态变为IMMUTABLE,
该配置指定了Receiver如何处理本地Segment Cache。可选值包含purge和fullBuild
   4).开始消费
   (1).创建replica set
   备注：
   点击
   (2).启动消费
   中间的粗体和较大数字表示最近一分钟的读取速率。下面的grep和较小的数字表
示(从左到右)：
   最近五分钟的摄取率
   最近十五分钟的摄取率
   自接收程序开始以来的平均摄取率
   receiver消耗的事件数
   receiver摄取的事件数量
   
   监视receiver状态